<?php
	####################################################
	# NForm 폼 관련 함수                               #
	####################################################

	class NForm {

		# 모드와 리턴URL을한다.
		public static function mode($action_mode = "", $returl = "" ) {
			if($returl == ""){
				$returl = substr(basename($_SERVER['PHP_SELF']),0,-4);
			}
			$ret = sprintf("<input type=\"hidden\" name=\"mode\" value=\"%s\"/>%s",$action_mode, PHP_EOL);
			$ret .= sprintf("<input type=\"hidden\" name=\"returl\" value=\"%s\"/>",$returl);
			return $ret;
		}

		# 폼을 오픈한다 : 파일명을 입력하지 않으면 기본적으로 process 붙은 파일명을 액션으로 리턴한다.
		public static function open($action_uri = "", $validation = TRUE, $unique = "", $method = "post", $is_file=FALSE) {
			$ret = "<!-- start form -->";

			if($action_uri == ""){
				$actarr = 	explode('.', substr(basename($_SERVER['PHP_SELF']),0,-4));
				$actarr[2] = 'process';
				$action_uri = implode('.', $actarr);
			}

			if($validation == TRUE){
				$validation = " onsubmit=\"return PageAction.validate();\"";
			}
			if($is_file){
				$file = "enctype=\"multipart/form-data\"";
			} else {
				$file = "";
			}
			$ret .= sprintf("<form name=\"formx_%s\" id=\"formx_%s\" method=\"%s\" action=\"%s\" %s %s>",
				$unique,
				$unique,
				$method,
				$action_uri,
				$file,
				$validation
			);
			$ret .= PHP_EOL;
			return $ret;
		}

		# 폼을 오픈한다 : 주로 검색용으로 사용된다.
		public static function self($action_uri = "", $validation = TRUE, $unique = "", $method = "get") {
			$ret = "<!-- start form -->";
			if($validation == TRUE){
				$validation = " onsubmit=\"return PageAction.validate();\"";
			}
			$ret .= sprintf("<form name=\"formx_%s\" id=\"formx_%s\" method=\"%s\" action=\"%s\" %s>",
				$unique,
				$unique,
				$method,
				substr(basename($_SERVER['PHP_SELF']),0,-4),
				$validation
			);
			$ret .= PHP_EOL;
			return $ret;
		}

		#폼을 닫는다.
		public static function close() {
			$ret = "";
			$ret .= sprintf("</form>");
			$ret .= "<!-- end form -->";
			$ret .= PHP_EOL;
			return $ret;
		}

		# 셀렉티드 : 셀렉트 박스 값 체크 용.
		# example)
		#	<option value="s" [?=NForm::selected($val['mjob'], "s")?]>학생</option>
		public static function selected($checkkey, $getvalue = "") {
			//echo "value='$checkkey'";
			if ($getvalue && $checkkey == $getvalue) echo " selected=\"selected\"";
		}

		# 체크박스 래디오 버튼 값 체크용.
		# example)
		#	<input type="radio" id="msex" name="msex" value="male" [?=NForm::checked($val['msex'], "male")?] /> 남성
		public static function checked($checkkey, $getvalue = "") {
			//echo "value='$getvalue'";
			if ($getvalue && $checkkey == $getvalue) echo " checked=\"checked\"";
		}

		# hidden 엘레멘트를 생성한다.
		public static function hidden($name="", $value="", $id="") {
			$ret = sprintf("<input type=\"hidden\" name=\"%s\" value=\"%s\" id=\"%s\">",
				$name,
				$value,
				$id
			);
			$ret .= PHP_EOL;
			return $ret;
		}

		# name[]과 같이 array로 넘긴 값을 foreach로 돌기 쉽게 연관배열로 리턴한다.
		# [puid][0]의 3 값이 [package_desc][3]의 2* 이 되어야함.
		# Array
		# (
		# 	[puid] => Array
		# 		(
		# 			[0] => 3
		# 		)
		#
		# 	[package_desc] => Array
		# 		(
		# 			[0] => 5
		# 			[1] => 4
		# 			[2] => 3
		# 			[3] => 2*
		# 			[4] => 1
		# 		)
		#
		# 	[param] => Array
		# 		(
		# 			[0] => 5
		# 			[1] => 4
		# 			[2] => 3
		# 			[3] => 2*
		# 			[4] => 1
		# 		)
		#
		# )
		# Array
		# (
		# 	[0] => Array
		# 		(
		# 			[puid] => 3
		# 			[package_desc] => 2*
		# 			[param] => 2*
		# 		)
		#
		# )
		# $p = POST 배열
		# $uid = 유니크키
		public static function dictionary($p, $uid, $is_print = FALSE) {
			$retarr = array();

			# 키가 존재하는지 확인
			foreach($p as $pkey=>$pval){
				$charr[] = $pkey;
			}
			if( ! in_array($uid, $charr) ){
				return FALSE;
			}

			# 해시맵을 만듬
			foreach($p[$uid] as $key=>$val){
				$retarr[] = array( $uid => $val);
			}
			foreach($retarr as $karr=>$varr ){
				foreach($varr as $k=>$v){
					foreach($p as $pkey=>$pval){
						if($pkey != $uid){
							foreach($p[$pkey] as $ppkey=>$ppval){
								if($retarr[$karr][$uid] == $ppkey){
									$retarr[$karr][$pkey] = $ppval;
								}
							}
						}

					}
				}
			}

			if($is_print){
				Nlog::xmp($retarr);
			}

			return $retarr;
		}
	}
?>